#Requires AutoHotkey v2.0
#Include SimLog.ahk



class FHashCode {

    __New(funEn := "SHA256", tempFile := A_ScriptDir . "temp.Tmp") {
        this.funEn := funEn  ; 加密函数
        this.tempFile := tempFile  ;临时文件路径
        ; 代码
    }

    static _match(ch) {
        if (IsUpper(ch)) {
            return true
        }

        if (IsLower(ch)) {
            return true
        }

        if (IsDigit(ch)) {
            return true
        }

        return false
    }

    hashFile(filePath, funEn := this.funEn) {

        ; 使用 Format 函数构建命令字符串，选择 SHA1 作为哈希算法
        cmd := Format('certutil -hashfile "{1}" SHA256 > "{2}"', filePath, this.tempFile)

        ; 直接使用 CMD 运行命令
        RunWait(A_ComSpec . ' /c ' . cmd, , 'Hide')

        ; 检查 temp.txt 是否成功生成
        if !FileExist(this.tempFile) {
            MsgBox "未能生成哈希值文件。"
            ExitApp
        }

        ; 读取 temp.txt
        strTemp := FileRead(this.tempFile)
        
        ; 用于循环的变量
        match := false
        count := 0
        
        ; 提取哈希码
        loop parse strTemp {

            if (FHashCode._match(A_LoopField)) { ; 匹配[0-9][a-Z]
                hash .= A_LoopField
                match := true
                count++
            } else if (A_LoopField == " ") { ; 匹配空格,但是视为无效字符
                match := true
            } else {
                match := false
            }

            ; 出现未匹配的字符()
            if (!match) {
                count := 0
                hash := ""
            }

            ; SHA256的长度为64
            if (count == 64) {
                break
            }

        }

        return hash
    }
}


